"""
@Filename: tools/assert_util.py
@Author: yoko
@Time: 2023/3/28 17:23
@Describe: ...
"""
import logging

import jsonpath
#通过文件名获得日志对象
logger=logging.getLogger(__name__)
# 总断言方法
def total_assert(validate,res):
    for key,value in validate.items():
        if key=="codes":
            code_assert(value,res.status_code)
        elif key=="equals":
            equals_assert(value,res.json())
        elif key=="contains":
            contains_assert(value,res.text)
        else:
            print("暂不执行此断言方式！")
            logger.error("暂不执行此断言方式！", exc_info=True)
            raise Exception("暂不执行此断言方式！")


def code_assert(yq_code,sj_code):
    """判断预期状态码和预期状态码是否相等"""
    if yq_code!=sj_code:
        raise AssertionError("断言状态码失败:预期状态码为"+str(yq_code)+"，实际状态码为："+str(sj_code))

# 相等断言
def equals_assert(yq_value,sj_json_value):
    for key,value in yq_value.items():
        sj_list_result=jsonpath.jsonpath(sj_json_value,'$..%s'%key)
        if sj_list_result:
            if value not in sj_list_result:
                logger.error("相等断言失败：预期："+str(yq_value)+"不等于"+"实际："+str(sj_json_value), exc_info=True)
                raise AssertionError("相等断言失败：预期："+str(yq_value)+"不等于"+"实际："+str(sj_json_value))
        else:
            raise AssertionError("相等断言失败：实际返回的响应中没有："+str(key))

# 包含断言
def contains_assert(yq_value,sj_text_value):
    if str(yq_value) not in sj_text_value:
        raise AssertionError("包含断言失败：实际返回的响应中不包含"+str(yq_value))